Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

<Name />, <Avatar />리팩터링 #107

Merged
merged 8 commits into from
Jul 14, 2023
Merged

<Name />, <Avatar />리팩터링 #107

merged 8 commits into from
Jul 14, 2023

Conversation

mjsdo
Copy link
Collaborator

@mjsdo mjsdo commented Jul 12, 2023

Issues

구분

  • 버그 수정
  • 기능 추가
  • 코드 리팩터링
  • 문서 업데이트
  • 기타

주요 변경점

스크린샷

기타

@mjsdo mjsdo requested a review from otterp012 July 12, 2023 17:19
@mjsdo mjsdo self-assigned this Jul 12, 2023
@mjsdo mjsdo changed the title <Name />, <Avatar />리팩터링 <Name />, <Avatar />`리팩터링 Jul 12, 2023
@mjsdo mjsdo changed the title <Name />, <Avatar />`리팩터링 <Name />, <Avatar />리팩터링 Jul 12, 2023
Copy link
Collaborator Author

@mjsdo mjsdo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Avatar 스토리북
AvatarGroup 스토리북
Name 스토리북

이렇게 참고해주시면 될 것 같습니다.

Comment on lines +9 to +17
const disableArgsTypes = disableArgs.reduce((acc, cur) => {
(acc as Record<string, unknown>)[cur] = {
table: {
disable: true,
},
};
return acc;
}, {});

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이거 다음 PR에 유틸로 하나 만들어둘게요.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

안그래도 저도 그생각했는데 이거 어디다가 둘지, 전역에 storybook 넣어서 utils만들지
고민하다가 미뤄놨어요 ㅋㅋ

Comment on lines +19 to 22
const validAvatars = Children.toArray(children).filter(
isValidElement<SingleAvatarProps>
);

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아까 여쭤본 props의 타입 추론을 이렇게 하는게 맞는거겠죠..?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

정확합니다!

Comment on lines +24 to +26
const emptyAvatarsCount = visibleCount - validAvatars.length;
const restAvatarsCount = maxCount - visibleCount;
const avatarSize = validAvatars[0].props?.size || 'sm';
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

지금 보면 요구사항에 +가 채워진 아바타 수가 아니라 총 인원수를 나타내도록 되어있어서 그렇게 바꿔놨습니다.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

size는 어차피 undefined여도 Avatar렌더링할 때 sm로 렌더링 되긴 하지만,
뒤에 남은 아바타 인원수 나타낼 때의 그 텍스트에도 크기를 지정해줘야 해서 "sm"을 디폴트 값으로 넣었어요. (textSizeCss가 undefined 키를 갖지 않기 때문에 타입 오류가 발생)

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

여기 잘하신 것 같아요!

major?: boolean;
nickName?: string;
isEmpty?: boolean;
userInfo?: UserInfo;
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아까 말씀드린 부분이 이거에요.
userInfo가 들어오면, 어떻게 그릴지가 Avatar컴포넌트의 책임이 되는데,
프로퍼티가 nickname, major, isEmpty 이렇게 나눠서 들어오면
null, undefined체크부터 시작해서 어떻게 그려야 할지가, Avatar를 사용하는 쪽의 책임이 되어버려서, 수정하기 어렵고, 수정이 발생했을때 변경되는 부분이 많아지고, 코드가 더 복잡해진다고 생각합니다.

유저정보를 받아서 그리는 컴포넌트는, UserInfo타입을 아토믹한 단위로 받는다고 생각하시면 될 것 같습니다.

물론 프로퍼티를 너무 명확하게 한 두개만 받는 경우엔 또 얘기가 달라지겠지만요

Comment on lines +29 to +31
{userInfo && (
<span css={[textCss[size], textCapitalizeCss, lineHeightCss]}>
{getFirstText(userInfo.nickname)}
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이쪽도 empty를 바깥에서 정의해줄 필요 없이, 데이터를 넘기지 않으면 그게 곧 Empty 아바타가 되는거로 생각했어요.

<Avatar user={user} /> => user데이터의 아바타를 그린다.
<Avatar /> => user의 아바타를 그려야 하는데, user가 없음 => empty

만약 강제로 Empty를 넣을 의도라면,
empty props추가해서 다음 시나리오로 가면 될것같아요.

  1. 유저정보가 없으면 기본적으로 빈 아바타
  2. 유저정보가 있으면 채워진 아바타
  3. 유저정보가 있는데 empty prop이 true면 빈 아바타 (즉, 유저 정보보다, empty가 우선순위가 높음. CSS의 !important같은것)

하지만, 아바타 그룹이 사용되는 곳을 보면 없는 유저에 대해서만 Empty로 그리기 떄문에 일단은 이렇게 가도 될 것 같아요.

}),
};
const textBaseCss = css({
maxWidth: 230,
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

네임의 maxWidth를 피그마에 있는대로 조절했습니다.

Comment on lines +44 to +45
{ '> div': { marginLeft: -4 } },
inlineFlex('center', 'center', 'row'),
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

inlineFlexflex가 컨테이너의 width: auto값에 대한 동작이 다르기 때문에 inlineFlex로 줬습니다.
flex는 부모넓이 기준이고 inlineFlex는 자식 엘리먼트들의 width합 만큼을 width로 갖게 돼요. (그래서 flex로 하면 아바타가 많아질때 각 아바타들이 shrink되서, 이걸 방지하려면 각 아바타마다 shrink: 0을 줘야합니다.)

이건 개수 늘려보다가 오류 발견한거라 고친거긴한데,
사실 아바타그룹은 md사이즈, visible은 4개로만 사용되는것 같아서 큰 의미는 없어요.

Copy link
Collaborator

@otterp012 otterp012 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

제가 이걸,,, 어프로브를 안눌러놨군요!

@otterp012 otterp012 merged commit 19bc323 into main Jul 14, 2023
@github-actions
Copy link

🎉 Storybook chromatic deployment results

Results
Build result Link
Storybook preview Link
Component count 42

@mjsdo mjsdo deleted the refactor/name-and-avatar branch July 19, 2023 19:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants